﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ActionTrackerEntities;
using ActionTrackerRules;
using ActionTrackerRules.Helpers;

namespace ActionTrackerWeb.Controllers
{
    public class ProyectoController : Controller
    {
        //
        // GET: /Proyecto/

        public ActionResult Index()
        {
            if (ValidarUsuario())
            {
                Usuario usuarioLogueado = (Usuario) Session["UsuarioLogueado"];
                if (usuarioLogueado.TipoUsuario == (int) TipoUsuarioEnum.Administrador)
                {
                    ProyectoRules oProyectoRules = new ProyectoRules();
                    List<Proyecto> oListProyectos = oProyectoRules.GetByFiltro(false);

                    return View(oListProyectos);
                }
                return RedirectToAction("Index", "Home");
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

        public bool ValidarUsuario()
        {
            Usuario usuario = (Usuario) Session["UsuarioLogueado"];
            if (usuario == null)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        // GET: /Proyecto/Create

        public ActionResult Create()
        {
            if (ValidarUsuario())
            {
                Usuario usuarioLogueado = (Usuario) Session["UsuarioLogueado"];
                if (usuarioLogueado.TipoUsuario == (int) TipoUsuarioEnum.Administrador)
                {
                    UsuarioRules oUsuarioRules = new UsuarioRules();
                    Proyecto model = new Proyecto() {Usuarios = oUsuarioRules.GetByFiltro(null, null, true)};

                    return View(model);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

        [HttpPost]
        public ActionResult Create(Proyecto model)
        {
            ProyectoRules oProyectoRules = new ProyectoRules();

            if (!model.Usuarios.Any(x => x.Check))
            {
                Session["MensajeError"] = "Debe seleccionar al menos un Usuario para el Proyecto";
                return RedirectToAction("Create");
            }


            switch (oProyectoRules.Guardar(model))
            {
                case ResponseEnum.Ok:
                    Session["MensajeExito"] = "Proyecto registrado con éxito";
                    return RedirectToAction("Index");
                case ResponseEnum.Error:
                    Session["MensajeError"] = "No se pudo registrar el Proyecto";
                    return RedirectToAction("Index");
                case ResponseEnum.EntidadExistente:
                    Session["MensajeError"] = "Existe un Proyecto con el mismo nombre '" + model.Objetivo.ToUpper() + "'";
                    return RedirectToAction("Create");
                default:
                    Session["MensajeError"] = "No se pudo registrar el Proyecto";
                    return RedirectToAction("Index");
            }
        }

        // GET: /Proyecto/Edit/1

        public ActionResult Edit(int id)
        {
            if (ValidarUsuario())
            {
                Usuario usuarioLogueado = (Usuario) Session["UsuarioLogueado"];
                if (usuarioLogueado.TipoUsuario == (int) TipoUsuarioEnum.Administrador)
                {
                    ProyectoRules oProyectoRules = new ProyectoRules();
                    Proyecto oProyecto = oProyectoRules.GetById(id);
                    
                    //Cargo todos los usuarios no chequeados para mostrar en pantalla
                    UsuarioRules oUsuarioRules = new UsuarioRules();
                    List<Usuario> oUsuariosParaMostrarEnPantalla = oUsuarioRules.GetByFiltro(null, null, true);
                    foreach (var usuario in oUsuariosParaMostrarEnPantalla)
                    {
                        if (usuario.Proyectos.Any(x => x.IdProyecto == oProyecto.IdProyecto))
                        {
                            usuario.Check = true;
                        }
                        else
                        {
                            usuario.Check = false;
                        }
                    }
                    oProyecto.Usuarios = oUsuariosParaMostrarEnPantalla;
                    
                    return View(oProyecto);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

        //
        // POST: /Proyecto/Edit/1

        [HttpPost]
        public ActionResult Edit(Proyecto model)
        {
            try
            {
                if (!model.Usuarios.Any(x => x.Check))
                {
                    Session["MensajeError"] = "Debe seleccionar al menos un Usuario para el Proyecto";
                    return RedirectToAction("Edit", new { id = model.IdProyecto });
                }

                ProyectoRules oProyectoRules = new ProyectoRules();
                switch (oProyectoRules.Actualizar(model))
                {
                    case ResponseEnum.Ok:
                        Session["MensajeExito"] = "Se editó el proyecto";
                        return RedirectToAction("Index");
                    case ResponseEnum.EntidadExistente:
                        Session["MensajeError"] = "Existe un Proyecto con el mismo nombre '" + model.Objetivo.ToUpper() + "'";
                        return RedirectToAction("Edit", new { id = model.IdProyecto });
                    case ResponseEnum.Error:
                        Session["MensajeError"] = "No se pudo editar el proyecto";
                        return RedirectToAction("Index");
                    default:
                        Session["MensajeError"] = "No se pudo editar el proyecto";
                        return RedirectToAction("Index");
                }

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

    }

    //#region SupportFuncs
    //void SaveState(Proyecto model)
    //{
    //    //creo una lista de los id de usuario que voy a guardar
    //    model.UsuariosAGuardar = string.Join(",", model.Usuarios.Select(p => p.IdUsuario.ToString()).ToArray());

    //    //Usuarios no miembros = todos los usuarios - agregados como miembros
    //    UsuarioRules oUsuarioRules = new UsuarioRules();
    //    model.UsuariosNoMiembros = oUsuarioRules.GetByFiltro(null, null, true).Except(model.Usuarios).ToList();
    //}

    //void RemoveUsuarios(Proyecto model)
    //{
    //    if (model.UsuariosMiembrosSeleccionados != null)
    //    {
    //        //TODO: no se cumple nunca la condición dentro del RemoveAll, por lo tanto va a eliminar todo
    //        model.Usuarios.ToList().RemoveAll(p => model.UsuariosMiembrosSeleccionados.Contains(p.IdUsuario));
    //        model.UsuariosMiembrosSeleccionados = null;
    //    }
    //}

    //void AddUsuarios(Proyecto model)
    //{
    //    if (model.UsuariosNoMiembrosSeleccionados != null)
    //    {
    //        UsuarioRules oUsuarioRules = new UsuarioRules();
    //        //TODO: revisar esta línea, users queda vacío al salir del método
    //        //harcodeado.. no debe ir esto
    //        if (!string.IsNullOrEmpty(model.UsuariosAGuardar))
    //        {
    //            string[] usersIds = model.UsuariosAGuardar.Split(',');
    //            if (usersIds.Any())
    //            {
    //                int[] lista;
    //                lista = model.UsuariosNoMiembrosSeleccionados;
    //                foreach (var usersId in usersIds)
    //                {
    //                    lista.ToList().Add(int.Parse(usersId));
    //                }
    //                model.UsuariosNoMiembrosSeleccionados = lista;
    //            }
    //        }
    //        var users = oUsuarioRules.GetByFiltro(null, null, true).Where(p => model.UsuariosNoMiembrosSeleccionados.Contains(p.IdUsuario)).ToList();
    //        //harcodeado.. debe usar AddRange
    //        model.Usuarios = users;
    //        model.UsuariosNoMiembrosSeleccionados = null;
    //    }
    //}

    //void RestoreSavedState(Proyecto model)
    //{
    //    model.Usuarios = new List<Usuario>();

    //    //get the previously stored items
    //    if (!string.IsNullOrEmpty(model.UsuariosAGuardar))
    //    {
    //        string[] usersIds = model.UsuariosAGuardar.Split(',');
    //        UsuarioRules oUsuarioRules = new UsuarioRules();
    //        var users = oUsuarioRules.GetByFiltro(null, null, true).Where(p => usersIds.Contains(p.IdUsuario.ToString())).ToList();
    //        //harcodeado.. debe usar AddRange
    //        model.Usuarios = users;
    //    }
    //}
    //#endregion

}


       
